package cn.ronghuanet.org.service.impl;

import cn.ronghuanet.basic.service.impl.BaseServiceImpl;
import cn.ronghuanet.org.domain.Department;
import cn.ronghuanet.org.mapper.DepartmentMapper;
import cn.ronghuanet.org.service.IDepartmentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * springboot默认支持注解事务
 * spring注解事务的3个步骤
 *   1 创建事务管理器
 *   2 开启对事务注解的支持
 *   3 在要用事务的类上,加注解
 * springboot已经默认完成了第1步和第2步
 *
 * 业务的service实现类
 *      1 继承 BaseServiceImpl 它里面有基本的增删改查公共方法的实现
 *      2 实现当前业务类的service接口  里面定义了需要自己实现的方法
 *
 */
@Service
public class DepartmentServiceImpl extends BaseServiceImpl<Department> implements IDepartmentService {

    @Autowired
    private DepartmentMapper departmentMapper;

    @Transactional
    @Override
    public void add(Department department) {
        // 设置新增时间为当前系统时间
        department.setCreate_time(new Date());
        departmentMapper.insert(department);
        // 处理path
        // 分析
        // 如果当前新增部门是一级部门,那么path=/自己的ID
        // 如果当前新增部门是二级部门,path = /父部门id/自己的ID
        // 如果当前新增部门是三级部门,path = /一级部门ID/父部门id/自己的ID
        // 方案一:从前端传递 [1,2] 前端传递的path字符串+/自己的ID
        // 方案二:后端处理(采纳这种)
            // 如果是一级部门,path=/自己的ID
            // 如果不是一级部门, path = 父部门的path+/自己的ID
        Department parent = department.getParent(); // 前端传递的父部门
        String path = "";
        if(Objects.isNull(parent) || Objects.isNull(parent.getId())){ // 它为空,说明前端没有选择父部门,说明当前就是一级部门
            path = "/"+department.getId();
        }else{
            // 拿到当前部门的父部门信息
            parent = departmentMapper.loadById(parent.getId());
            // path = 父部门的path+/自己的ID
            path = parent.getPath() +"/"+department.getId();
        }
        // 将path赋值给department
        department.setPath(path);
        // 修改
        departmentMapper.update(department);
    }

    @Transactional
    @Override
    public void update(Department department) {
        // 设置修改时间为当前系统时间
        department.setUpdate_time(new Date());
        // 处理path
        Department parent = department.getParent(); // 前端传递的父部门
        String path = "";
        if(Objects.isNull(parent) || Objects.isNull(parent.getId())){ // 它为空,说明前端没有选择父部门,说明当前就是一级部门
            path = "/"+department.getId();
        }else{
            // 拿到当前部门的父部门信息
            parent = departmentMapper.loadById(parent.getId());
            // path = 父部门的path+/自己的ID
            path = parent.getPath() +"/"+department.getId();
        }
        // 将path赋值给department
        department.setPath(path);
        departmentMapper.update(department);
    }

    @Override
    public List<Department> tree() {
        return departmentMapper.tree();
    }
}
